package com.qkjia.channel;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 *  FileChannel读取数据到buffer中
 */
public class FileChannelDemo1 {
    public static void main(String[] args) throws Exception {
        //创建FileChannel   为“rw”且安全管理器的checkWrite方法拒绝对文件的写访问
        RandomAccessFile aFile = new RandomAccessFile("e:\\qkjia\\01.txt","rw");
        FileChannel channel = aFile.getChannel();

        // 创建Buffer
        // ByteBuffer.allocate(1024);分配一个新的字节缓冲区
        ByteBuffer buf = ByteBuffer.allocate(1024);

        //读取数据到buffer中
        int bytesRead = channel.read(buf);
        while(bytesRead != -1) {
            System.out.println("读取了："+bytesRead);
            // buf.flip(); 翻转这个缓冲区。 将限制设置为当前位置，然后将位置设置为零。 如果定义了标记，则将其丢弃。
            // 在一系列通道读取或放置操作之后，调用此方法以准备一系列通道写入或相关获取操作
            buf.flip();
            // buf.hasRemaining() 告诉当前位置和限制之间是否有任何元素。
            while(buf.hasRemaining()) {
                // (char)buf.get() 相对获取方法。 读取此缓冲区当前位置的字节，然后增加该位置。
                System.out.println((char)buf.get());
            }
            // 清除此缓冲区。
            buf.clear();
            bytesRead = channel.read(buf);
        }
        // 关闭此随机访问文件流并释放与该流关联的任何系统资源。 关闭的随机访问文件无法执行输入或输出操作，也无法重新打开。
        aFile.close();
        System.out.println("结束了");
    }
}
